/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jjsoft.disco.gco.ngc;

import com.jjsoft.disco.gco.dao.GenericController;
import com.jjsoft.disco.gco.mdl.Producto;
import com.jjsoft.disco.gco.mdl.Productobarra;
import com.jjsoft.disco.gco.mdl.Proveedor;
import com.jjsoft.disco.gco.mdl.Proveedorproducto;
import com.jjsoft.disco.gco.util.AtributoInvalidoException;
import com.jjsoft.disco.gco.util.IdDuplicadoException;
import com.jjsoft.disco.gco.util.ProductoValidadorException;
import com.jjsoft.disco.gco.util.ValidarAtributoUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Johnny
 */
public class ProductoManager {

    GenericController<Producto> controladorProducto = new GenericController<Producto>();
    GenericController<Proveedorproducto> controladorProvArt = new GenericController<Proveedorproducto>();

    public void crearProducto(Producto producto, List<Proveedor> proveedores) throws ProductoValidadorException {
        try {
            ValidarAtributoUtil.validarObjetoNulo("Producto", producto);
            ValidarAtributoUtil.validarStringNuloVacio("Código", producto.getCodigo());
            ValidarAtributoUtil.validarStringNuloVacio("Descripción", producto.getDescripcion());
            ValidarAtributoUtil.validarDoubleNegativo("P. Venta", producto.getPrecioVenta());
            ValidarAtributoUtil.validarDoubleNegativo("Categoria", producto.getIdCategoria().getIdCategoria());
            if (controladorProducto.create(producto).equals("1")) {
                throw new ProductoValidadorException(new IdDuplicadoException("Ya existe un producto con ese código", producto.getCodigo()));
            }
            if (proveedores != null && !proveedores.isEmpty()) {
                GenericController<Proveedorproducto> controladorPP = new GenericController<Proveedorproducto>();
                for (int i = 0; i < proveedores.size(); i++) {
                    Proveedorproducto agregar = new Proveedorproducto();
                    agregar.setIdProducto(producto);
                    agregar.setIdProveedor(proveedores.get(i));
                    controladorPP.create(agregar);
                }

            }
        } catch (AtributoInvalidoException ex) {
            throw new ProductoValidadorException(ex);
        } catch (Exception ex) {
            throw new ProductoValidadorException("Error Desconocido " + ex.getLocalizedMessage());
        }

    }

    public void editarProducto(Producto producto, List<Proveedor> proveedores) throws ProductoValidadorException {
        try {
            ValidarAtributoUtil.validarObjetoNulo("Producto", producto);
            ValidarAtributoUtil.validarStringNuloVacio("Código", producto.getCodigo());
            ValidarAtributoUtil.validarStringNuloVacio("Descripción", producto.getDescripcion());
            ValidarAtributoUtil.validarDoubleNegativo("P. Venta", producto.getPrecioVenta());
            ValidarAtributoUtil.validarDoubleNegativo("Categoria", producto.getIdCategoria().getIdCategoria());
            controladorProducto.edit(producto);
            GenericController<Proveedorproducto> controladorPP = new GenericController<Proveedorproducto>();
            for (int i = 0; i < producto.getProveedorproductoList().size(); i++) {
                controladorPP.destroy(new Proveedorproducto(), producto.getProveedorproductoList().get(i).getIdproveedorProducto());
            }
            if (proveedores != null && !proveedores.isEmpty()) {

                for (int i = 0; i < proveedores.size(); i++) {
                    Proveedorproducto agregar = new Proveedorproducto();
                    agregar.setIdProducto(producto);
                    agregar.setIdProveedor(proveedores.get(i));
                    controladorPP.create(agregar);
                }

            }
        } catch (AtributoInvalidoException ex) {
            throw new ProductoValidadorException(ex);
        } catch (Exception ex) {
            throw new ProductoValidadorException("Error Desconocido " + ex.getLocalizedMessage());
        }
    }

    public List<Producto> listarProductos() {
        return controladorProducto.findWhere(new Producto(), "Estado=0");
    }

    public List<Producto> listarStockCompleto() {
        List<Producto> listaProductos = controladorProducto.findWhere(new Producto(), "Estado=0 and Tipo=0");
        GenericController<Productobarra> cpb = new GenericController<Productobarra>();

        for (int i = 0; i < listaProductos.size(); i++) {
            List<Productobarra> listaProductosBarra = cpb.findWhere(new Productobarra(), "idProducto= " + listaProductos.get(i).getIdProductos());
            for (int j = 0; j < listaProductosBarra.size(); j++) {
                listaProductos.get(i).setStock(listaProductos.get(i).getStock() + listaProductosBarra.get(j).getCantidad());
            }
        }
        return listaProductos;
    }

    public List<Producto> listarStockCompleto(int stockMinimo) {
        List<Producto> listaProductos = controladorProducto.findWhere(new Producto(), "Estado=0 and Tipo=0");
        GenericController<Productobarra> cpb = new GenericController<Productobarra>();

        for (int i = 0; i < listaProductos.size(); i++) {
            List<Productobarra> listaProductosBarra = cpb.findWhere(new Productobarra(), "idProducto= " + listaProductos.get(i).getIdProductos());
            for (int j = 0; j < listaProductosBarra.size(); j++) {
                listaProductos.get(i).setStock(listaProductos.get(i).getStock() + listaProductosBarra.get(j).getCantidad());
            }
        }
        if (stockMinimo != -1) {
            for (int i=listaProductos.size()-1;i>=0;i--) {
                if (listaProductos.get(i).getStock() > stockMinimo) {
                    listaProductos.remove(listaProductos.get(i));
                }
            }
        }

        return listaProductos;
    }

    public List<Producto> listarProductos(int tipo) {
        return controladorProducto.findWhere(new Producto(), "Estado=0 and Tipo=" + tipo);
    }

    public List<Producto> listarProductos(int tipo, int stockMinimo) {
        if (stockMinimo != -1) {
            return controladorProducto.findWhere(new Producto(), "Estado=0 and Tipo=" + tipo + " and stock<=" + stockMinimo);
        } else {
            return controladorProducto.findWhere(new Producto(), "Estado=0 and Tipo=" + tipo);
        }
    }

    public List<Producto> listarProductos(String criterio, int tipo) {
        List<Producto> listaProducto = controladorProducto.findHibernateSearch(new Producto(), criterio, "codigo", "descripcion");
        for (int i = listaProducto.size(); i > 0; i--) {
            if (listaProducto.get(i - 1).getEstado() == 1 || (tipo != listaProducto.get(i - 1).getTipo() && tipo != -1)) {
                listaProducto.remove(i - 1);
            }
        }
        return listaProducto;
    }

    public List<Producto> buscarPorBarra(int barra, int stockMinimo) {

        ProductoBarraManager pbm = new ProductoBarraManager();
        List<Productobarra> productos = pbm.cargarProductos(barra);
        List<Producto> listaProductos = new ArrayList<Producto>();
        for (Productobarra producto : productos) {
            if(stockMinimo==-1){
                producto.getIdProducto().setStock(producto.getCantidad());
                listaProductos.add(producto.getIdProducto());
            }else if(producto.getCantidad()<=stockMinimo) 
            {
                producto.getIdProducto().setStock(producto.getCantidad());
                listaProductos.add(producto.getIdProducto());
            }
            
        }
        return listaProductos;
    }

    public void eliminarProducto(Producto producto) {
        producto.setEstado(1);
        try {
            controladorProducto.edit(producto);
        } catch (Exception ex) {

        }
    }

    public Producto buscarPorCodigo(String codigo) {
        try {
            Producto producto = controladorProducto.findWhere(new Producto(), "codigo='" + codigo + "' and estado=0").get(0);
            return producto;
        } catch (Exception ex) {
            return null;
        }
    }

    public void reducirStock(Producto producto, double cantidad) {
        try {
            producto.setStock(producto.getStock() - cantidad);
            controladorProducto.edit(producto);
        } catch (Exception ex) {
            Logger.getLogger(ProductoManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void aumentarStock(Producto producto, double cantidad) {
        try {
            producto.setStock(producto.getStock() + cantidad);
            controladorProducto.edit(producto);
        } catch (Exception ex) {
            Logger.getLogger(ProductoManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public List<Proveedorproducto> buscaProveedores(Producto articulo) {
        List<Proveedorproducto> listaProveedores = controladorProvArt.findWhere(new Proveedorproducto(), "idProducto=" + articulo.getIdProductos());
        return listaProveedores;
    }
}
